package basics

import "fmt"

// AnonymousFunctionsUse 匿名函数场景应用
// 编写一个函数，用于描述一个人每天上班都需要干嘛
// 职场中的人每天上班前，下班后要做的事几乎都是相同的，但是每天上班过程中要做的事确实不确定的
//所以此时我们可以使用匿名函数来解决，让上班的人自己觉得自己每天上班需要干什么

func AnonymousFunctionsUse() {
	// 老板的一天
	fmt.Println("老板的一天…")
	work(func() {
		fmt.Println("看公司报表")
		fmt.Println("领着秘书转一转")
		fmt.Println("回办公室歇着")
	})
	fmt.Println()

	// 项目经理的一天
	fmt.Println("项目经理的一天…")
	work1(func() {
		fmt.Println("组织部门开会")
		fmt.Println("给部门员工分配今天工作任务")
		fmt.Println("检查部门员工昨天提交的代码")
	})
	fmt.Println()

	// 程序援的一天
	fmt.Println("程序援的一天…")
	work2(func() {
		fmt.Println("参加部门会议")
		fmt.Println("修改测试提交的BUG")
		fmt.Println("完成老大今天安排的任务")
	})
}

// 根据传入实现，插入逻辑流程
func work(custom func()) {
	// 上班前
	fmt.Println("起床")
	fmt.Println("刷牙")
	fmt.Println("洗脸")
	fmt.Println("出门")
	fmt.Println("上班打卡")
	fmt.Println("开电脑")
	// 上班中
	custom()
	// 下班后
	fmt.Println("关电脑")
	fmt.Println("下班打卡")
	fmt.Println("出门")
	fmt.Println("到家")
	fmt.Println("吃饭")
	fmt.Println("睡觉")
}

// 这种写法的好处是代码层次清晰
// 并且如果有一些变量只需要在上班前或下班后使用，还可以将这些变量隔离，不对外界造成污染
func work1(custom func()) {
	// 上班前
	func() {
		fmt.Println("起床")
		fmt.Println("刷牙")
		fmt.Println("洗脸")
		fmt.Println("出门")
		fmt.Println("上班打卡")
		fmt.Println("开电脑")
	}()
	// 上班中
	custom()
	// 下班后
	func() {
		fmt.Println("关电脑")
		fmt.Println("下班打卡")
		fmt.Println("出门")
		fmt.Println("到家")
		fmt.Println("吃饭")
		fmt.Println("睡觉")
	}()
}

// 前提条件是这个函数只在work2函数中使用，两者有较强的关联性，否则建议定义为普通函数
func work2(custom func()) {
	pre := func() {
		fmt.Println("起床")
		fmt.Println("刷牙")
		fmt.Println("洗脸")
		fmt.Println("出门")
		fmt.Println("上班打卡")
		fmt.Println("开电脑")
	}
	latter := func() {
		fmt.Println("关电脑")
		fmt.Println("下班打卡")
		fmt.Println("出门")
		fmt.Println("到家")
		fmt.Println("吃饭")
		fmt.Println("睡觉")
	}
	// 上班前
	pre()
	// 上班中
	custom()
	// 下班后
	latter()
}
